package cn.wolfcode.exception;

import cn.wolfcode.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 对控制器进行增强
 */
@ControllerAdvice
public class ControllerAdviceForException {

    /**
     * 代表该方法是用来处理异常的
     * 注解上可以指定该方法是捕获哪种异常
     */
    @ExceptionHandler(RuntimeException.class)
    public Object handlerException(Model model, RuntimeException e, HttpServletResponse response, HandlerMethod method){
        e.printStackTrace(); //输出异常信息，为了找bug方便
        //如果用户访问的处理方法本来是返回视图的现在也应该返回视图
        //判断出现了异常的方法，是否有贴ResponseBody注解
        if(method.hasMethodAnnotation(ResponseBody.class)){
            //利用响应对象输出json数据
            response.setContentType("application/json;charset=utf-8");
          /*  if(e.getMessage()!=null){ //如果异常信息中有message

            }*/
            JsonResult json = new JsonResult(false, "操作失败，请联系管理员");
            try {
                response.getWriter().println(JSON.toJSONString(json));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return null;
        }else{
            model.addAttribute("ex",e);
            return "common/error";//错误视图
        }
    }


    /**
     * 捕获没有权限的异常
     * @param e
     * @param response
     * @param method
     * @return
     */
    @ExceptionHandler(UnauthorizedException.class)
    public Object handlerUnauthorizedException(RuntimeException e, HttpServletResponse response, HandlerMethod method){
        e.printStackTrace(); //输出异常信息，为了找bug方便
        //如果用户访问的处理方法本来是返回视图的现在也应该返回视图
        //判断出现了异常的方法，是否有贴ResponseBody注解
        if(method.hasMethodAnnotation(ResponseBody.class)){
            //利用响应对象输出json数据
            response.setContentType("application/json;charset=utf-8");
            JsonResult json = new JsonResult(false, "您没有权限进行操作！");
            try {
                response.getWriter().println(JSON.toJSONString(json));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return null;
        }else{
            return "common/nopermission";//沒有异常视图
        }
    }

}
